libxl/xl: support empty disk paths (ejected cdroms)
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Tue, 25 Jan 2011 18:06:53 +0000 (18:06 +0000)
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>
Tue, 25 Jan 2011 18:06:53 +0000 (18:06 +0000)
Support empty disk paths, including in domain config files, for
compatibility with xend.  This allows a domain to be created with a
cdrom which is initially in the "ejected" (no cd present) state.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/libxl_device.c
tools/libxl/xl_cmdimpl.c

index c4477c7c52fe837b9e0ff6491075146079f9a719..93a22d202474ceea9779b66591d98857aa87a4ed 100644 (file)
@@ -646,8 +646,8 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event
 
     disk->backend_domid = 0;
     disk->domid = domid;
-    disk->physpath = NULL;
-    disk->phystype = 0;
+    disk->physpath = strdup("");
+    disk->phystype = PHYSTYPE_EMPTY;
     /* this value is returned to the user: do not free right away */
     disk->virtpath = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend));
     disk->unpluggable = 1;
@@ -882,6 +882,8 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
             device.backend_kind = DEVICE_VBD;
             break;
         }
+        case PHYSTYPE_EMPTY:
+            break;
         case PHYSTYPE_FILE:
             /* let's pretend is tap:aio for the moment */
             disk->phystype = PHYSTYPE_AIO;
@@ -1606,7 +1608,7 @@ static unsigned int libxl_append_disk_list_of_type(libxl_ctx *ctx,
             pdisk->backend_domid = 0;
             pdisk->domid = domid;
             physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/params", be_path, *dir), &len);
-            if (strchr(physpath_tmp, ':')) {
+            if (physpath_tmp && strchr(physpath_tmp, ':')) {
                 pdisk->physpath = strdup(strchr(physpath_tmp, ':') + 1);
                 free(physpath_tmp);
             } else {
@@ -1684,7 +1686,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
 
     if (!disk->physpath) {
         disk->physpath = strdup("");
-        disk->phystype = PHYSTYPE_PHY;
+        disk->phystype = PHYSTYPE_EMPTY;
     }
     disks = libxl_device_disk_list(ctx, domid, &num);
     for (i = 0; i < num; i++) {
index cf97b7c3b324052f5304e022824ca73b72be5335..1160de3c8cbc4d507590dd27267557aeac876db0 100644 (file)
@@ -178,6 +178,7 @@ typedef enum {
     PHYSTYPE_AIO,
     PHYSTYPE_FILE,
     PHYSTYPE_PHY,
+    PHYSTYPE_EMPTY,
 } libxl_disk_phystype;
 
 typedef enum {
index 2d430b7ffe916aeb8e96580a14b4eb13b0dafdad..cf694d2f823623e9a45cd21b9fff4e64bcb292d4 100644 (file)
@@ -130,6 +130,7 @@ char *libxl__device_disk_string_of_phystype(libxl_disk_phystype phystype)
         case PHYSTYPE_AIO: return "aio";
         case PHYSTYPE_FILE: return "file";
         case PHYSTYPE_PHY: return "phy";
+        case PHYSTYPE_EMPTY: return "file";
         default: return NULL;
     }
 }
@@ -143,6 +144,7 @@ char *libxl__device_disk_backend_type_of_phystype(libxl_disk_phystype phystype)
         case PHYSTYPE_AIO: return "tap";
         /* let's pretend file is tap:aio */
         case PHYSTYPE_FILE: return "tap";
+        case PHYSTYPE_EMPTY: return "tap";
         case PHYSTYPE_PHY: return "phy";
         default: return NULL;
     }
index 5f2cab299aac188021aa75f47ff765a5def80fac..ba2bc29e4b0f9e67d87a372743715298acaf94d0 100644 (file)
@@ -457,6 +457,11 @@ static int parse_disk_config(libxl_device_disk *disk, char *buf2)
                     return 0;
                 }
                 tok = p + 1;
+            } else if (*p == ',') {
+                state = DSTATE_VIRTPATH;
+                disk->phystype = PHYSTYPE_EMPTY;
+                disk->physpath = strdup("");
+                tok = p + 1;
             }
             break;
         case DSTATE_TAP:
@@ -1834,8 +1839,8 @@ static void cd_insert(const char *dom, const char *virtdev, char *phys)
             libxl_string_to_phystype(&ctx, phys, &disk.phystype);
         }
     } else {
-            disk.physpath = NULL;
-            disk.phystype = 0;
+            disk.physpath = strdup("");
+            disk.phystype = PHYSTYPE_EMPTY;
     }
     disk.virtpath = (char*)virtdev;
     disk.unpluggable = 1;